﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebAppPlanProduccion.Code;
using Web.Framework;
using System.IO;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code.Security;
using PlanProd.Contracts.Validation;
using System.Text;
using PlanProd.Contracts.Search;
using PlanProd.ServiceFactory;

namespace WebAppPlanProduccion.App
{
    public partial class PresupuestoProduccionCreate : BasePage
    {       
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                HasPermissionToSeeMe(PlanProdSecurity.PRESUPUESTOPRODUCCION_VER);

                if (!this.IsPostBack)
                {
                    UIHelper.LoadTemporadas(this.cboTemporada);
                    UIHelper.LoadDestinos(this.cboDestino);
                    UIHelper.LoadProveedores(this.cboProveedor);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private List<LinkButton> actionButtons = new List<LinkButton>();
        LinkButton guardarButton = new LinkButton();
        LinkButton cancelarButton = new LinkButton();
        LinkButton bajarArchivoDeEjemploPlanillaButton = new LinkButton();
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            guardarButton.ID = "BoCommandGuardar";
            guardarButton.Text = "Guardar";
            guardarButton.Click += new EventHandler(lnkGuardar_Click);
            actionButtons.Add(guardarButton);

            bajarArchivoDeEjemploPlanillaButton.ID = "BoCommandBajarEjemplo";
            bajarArchivoDeEjemploPlanillaButton.Text = "Bajar Excel de Ejemplo";
            bajarArchivoDeEjemploPlanillaButton.ClientIDMode = System.Web.UI.ClientIDMode.Static;
            bajarArchivoDeEjemploPlanillaButton.OnClientClick = "location.href = '/SampleFiles/EjPresupuestoComercialIndividual.xlsx'; return false;";
            actionButtons.Add(bajarArchivoDeEjemploPlanillaButton);               

            cancelarButton.ID = "BoCommandCancelar";
            cancelarButton.Text = "Cancelar";
            cancelarButton.Click += new EventHandler(lnkCancelar_Click);
            actionButtons.Add(cancelarButton);

            base.LoadContextActions(actionButtons);
        }		

        protected override void ApplySecurity()
        {
            base.ApplySecurity();

            this.filePresupuestoProduccion.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_DETALLE_IMPORTAR);
            guardarButton.Visible =
            this.lnkGuardar.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_CREAR);
        }

        protected void lnkGuardar_Click(object sender, EventArgs e)
        {
            string filePath = string.Empty;
            try
            {
                int temporadaId = UIHelper.GetIntFromInputCbo(this.cboTemporada).Value;
                int destinoId = UIHelper.GetIntFromInputCbo(this.cboDestino).Value;
                int proveedorId = UIHelper.GetIntFromInputCbo(this.cboProveedor).Value;

                PresupuestoProduccion presupuestoProduccion = new PresupuestoProduccion();

                presupuestoProduccion.Nombre = this.txtNombre.Text;
                presupuestoProduccion.TemporadaId = temporadaId;
                presupuestoProduccion.DestinoId = destinoId;
                presupuestoProduccion.ProveedorId = proveedorId;
                presupuestoProduccion.EmpresaId = BaseWebPage.CompanyId;

                if (this.filePresupuestoProduccion.HasFile)
                {
                    string tmpPath = HttpContext.Current.Server.MapPath("/Tmp");
                    string fileName = Guid.NewGuid().ToString();
                    filePath = Path.Combine(tmpPath, fileName);
                    this.filePresupuestoProduccion.SaveAs(filePath);
                    List<string> parseErrors = new List<string>();

                    Temporada temporada = WebServiceHelper.GetTemporadaById(presupuestoProduccion.TemporadaId);
                    Destino destino = WebServiceHelper.GetDestinoById(presupuestoProduccion.DestinoId);

                    Proveedor proveedor = WebServiceHelper.GetProveedores(WebServiceHelper.ServiceOptionsDefault, new SearchProveedorCriteria() { EmpresaId = BaseWebPage.CompanyId, Id = proveedorId}).Single();
                    presupuestoProduccion.ProveedorIdExterno = proveedor.ProveedorIdExterno;

                    presupuestoProduccion.DestinoCodigoExterno = destino.CodigoExterno;
                    presupuestoProduccion.TemporadaCodigoExterno = temporada.CodigoExterno;

                    //Proveedor proveedor = 
                    // Cargar objetos de producto color
                    var presupuestoProduccionDetalles = ExcelHelper.GetPresupuestoProduccionDetalleProdFromExcel(filePath, presupuestoProduccion, temporada, parseErrors);           
                  
                    List<ProductoValidation> productosAValidar = new List<ProductoValidation>();
                    foreach (var detallePresupuestoProduccion in presupuestoProduccionDetalles)
                    {
                        productosAValidar.Add(new ProductoValidation()
                        {
                            Producto = detallePresupuestoProduccion.ProductoIdExterno,
                            ColorId = detallePresupuestoProduccion.ColorId
                        });
                    }

                    List<ProductoValidation> productosValidados = WebServiceHelper.ValidarProductos(productosAValidar);

                    if (parseErrors.Count == 0 && productosValidados.Count == 0)
                    {
                        presupuestoProduccion.DetalleDeProductos.AddRange(presupuestoProduccionDetalles);
                        IPlanProdAdmin service = ServiceFactory.GetPlanProdAdminService();                        

                        presupuestoProduccion = service.SavePresupuestoProduccion(WebServiceHelper.ServiceOptionsDefault, presupuestoProduccion);
                        Response.Redirect(string.Format("/App/PresupuestoProduccionEdit.aspx?Id={0}", presupuestoProduccion.Id), true);
                    }
                    else
                    {
                        StringBuilder builder = new StringBuilder();
                        string separador = string.Empty;
                        foreach (string parseError in parseErrors)
                        {
                            builder.Append(separador);
                            builder.AppendLine(parseError);
                            separador = "<br />";
                        }
                   
                        if (productosValidados.Count > 0)
                        {
                            builder.Append(separador);
                            builder.AppendLine("Los siguientes productos no existen en la base de datos:");
                            foreach (ProductoValidation productoInexistente in productosValidados)
                            {
                                builder.Append(separador);
                                builder.AppendLine(string.Format("Producto: {0}, Color: {1}", productoInexistente.Producto, productoInexistente.ColorId));
                                separador = "<br />";
                            }
                        }

                        masterPage.ShowMessage(builder.ToString(), WebMessageType.Error);
                    }
                }              
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
            finally
            {
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect("/App/PresupuestoProduccionList.aspx", true);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}